package com.cs.beneficios.business.entity;


import com.cs.beneficios.business.model.UsuarioxSedeVO;
import com.cs.beneficios.business.model.Beneficiario_AtributoVO;
import com.cs.beneficios.common.ConnectionFactory;
//import java.sql.BatchUpdateException;
import java.sql.Connection;
//import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
//import java.util.HashMap;
import java.util.List;
//import java.util.Vector;
//import java.sql.PreparedStatement;
//import java.util.Iterator;

import com.cs.beneficios.business.model.BeneficioVO;
//import com.cs.beneficios.business.model.SubProgramaVO;

public class BeneficioDAO 
{

  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;

  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
  
  public BeneficioDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }
  
  
  public boolean checkBeneficio(Long codeSede, Long codeSubpro) throws SQLException
  {
    String query = "select NUMERO_BEN_DISPONIBLE "+
                   "from TCS_BEN_SUBPROGRAMA_SEDE "+
                   "where ";
    boolean retorno = false;
    if((Object)codeSede != null && (Object)codeSubpro != null)
    {
      query += " SEDE_CODIGO = "+codeSede+" and SBPR_CODIGO = "+codeSubpro;
      //System.out.println(query);
      ResultSet rst = cf.getRecordsRset(query,null,conn);
      if(rst.next())
      {
        int disponibles = rst.getInt("NUMERO_BEN_DISPONIBLE");
        if(disponibles > 0)
        {
          retorno = true;
        }
      }
    }
    return retorno;
  }
  
   /* public boolean checkVigencia(Long codeSede, Long codeSub) throws SQLException {
        String query = "SELECT COUNT(1) FROM VCS_BEN_SEDES WHERE CODIGO ="+codeSede+" AND CODSUB = "+codeSub;

        ResultSet rst = cf.getRecordsRset(query, null, conn);
        
        if(rst.next()){
            if(rst.getInt(1) == 0){
                return false;
            }else{
                return true;
            }
        }
        
        return false;
        
    }*/
  
  
  public Collection getUsuarioxBeneficio(String idben)
  {
 
      String query = "SELECT PRG.NOMBRE PROGRAMA,SUB .NOMBRE SUBPROGRAMA,SEDE.NOMBRE, USU.NOMBRE USUARIO " +                
"FROM TCS_BEN_PROGRAMA PRG, TCS_BEN_SUBPROGRAMA SUB, TCS_BEN_SEDE SEDE, TCS_BEN_SUBPROGRAMA_SEDE SUBSEDE, TCS_BEN_USUARIO_SEDE USUSEDE, PAOYER.TCS_USUARIO USU " +
"WHERE PRG.CODIGO = SUB. PRG_CODIGO AND SUB.CODIGO = SUBSEDE. SBPR_CODIGO AND SEDE.CODIGO = SUBSEDE. SEDE_CODIGO AND SUBSEDE.CODIGO = USUSEDE. SPSE_CODIGO AND USU.CODIGO = USUSEDE. USU_CODIGO "+
"AND SUB.CODIGO ="+idben;


                     
    ResultSet rst = null;
    ArrayList Usuarios = new ArrayList();
    try{
    rst = cf.getRecordsRset(query,null,conn);
    UsuarioxSedeVO usu = null;
   	while (rst.next()) 
      {
       usu = new UsuarioxSedeVO();
       usu.setNombreUsuario(rst.getString("USUARIO"));
      // usu.setCodeUsuario(new Long(rst.getString("codeusu")));
       usu.setNombrePrograma(rst.getString("PROGRAMA"));
       usu.setNombreSubprograma(rst.getString("SUBPROGRAMA"));
       Usuarios.add(usu);
       usu = null;
      
      }
     rst.close();
      
    }catch(SQLException e){
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSSPE - cwsub ********/");
    }
    
    return Usuarios;
   
   
  }
  
  public String getPrograma(String codeSubprograma) throws SQLException {
	  String strSql = "SELECT PRG_CODIGO " +
					  " FROM TCS_BEN_SUBPROGRAMA " +
					  " WHERE CODIGO ="+ codeSubprograma;
                      
	  ResultSet rst = null;
	  rst = cf.getRecordsRset(strSql, null, conn);
      
	  rst.next();
      
	  return rst.getString("PRG_CODIGO");
  }
  
  public boolean renewBeneficio(Long codeSubpro, Long codeBeneficiario, 
                                Long codeOldSede, Long codeNewSede, 
                                String fechaOtorgamiento) throws SQLException
  {
    boolean retorno = true;
    if((Object)codeSubpro != null && (Object)codeBeneficiario != null && (Object)codeNewSede != null)
    {
      if(checkBeneficio(codeNewSede,codeSubpro))
      {
        String query = " INSERT INTO TCS_BEN_BENEFICIO_OTORGADO "+
                       " (CODIGO, SBPR_CODIGO, BEN_CODIGO, "+
                       " SEDE_CODIGO, FECHA_BENEFICIO) "+
                       " VALUES (SCS_BEN_BOT.NextVal,"+codeSubpro+","+codeBeneficiario+
                       ","+codeNewSede+",to_char(sysdate,'dd/mm/rrrr')) ";
        
        int iRegInsert = cf.execSql(query,null,conn);
        if(iRegInsert > 0)
        {
          query = "select SCS_BEN_BOT.currval codigo from dual ";
          ResultSet max = null;
          max = cf.getRecordsRset(query,null,conn);
          if(max.next())
          {
            Long codeBotNuevo = new Long(max.getLong("codigo"));
            query = "select codigo from TCS_BEN_SUBP_ATR_BENEFICIARIO "+
                         "where SBPR_CODIGO = "+codeSubpro+
                         " and TIPO_ATRIBUTO = 'B' ";
            ResultSet rst = null;
            rst = cf.getRecordsRset(query,null,conn);
            query = "select codigo "+
                    "from TCS_BEN_BENEFICIO_OTORGADO "+
                    "where SBPR_CODIGO = "+codeSubpro+
                    " and BEN_CODIGO = "+codeBeneficiario+
                    " and SEDE_CODIGO = "+codeOldSede+
                    " and FECHA_BENEFICIO = to_date('"+fechaOtorgamiento+"')";
            ResultSet rst1 = null;
            
            rst1 = cf.getRecordsRset(query,null,conn);
            if(rst1.next())
            {
              while(rst.next())
              {
                 if(updateBeneficioAtributo(new Long(rst.getLong("codigo")),codeBotNuevo,new Long(rst1.getLong("codigo"))))
                 {
                    retorno = true;
                 }else{
                   retorno = false;
                   break;
                 }
              }
               query = "update TCS_BEN_BENEFICIO_OTORGADO set campo_a1 = 'I' where codigo = "+rst1.getLong("codigo");
               
               int iReg = cf.execSql(query,null,conn);
               if(iReg > 0)
                  retorno = true;
               else 
                  retorno = false;
            }else
            {
              retorno = false;
            }
            
          }
          
        }else retorno  = false;  
      }else retorno = false;
    }
    if(!retorno) conn.rollback();
    else
    {
      updateBeneficioDisponible(codeNewSede,codeSubpro);
    }
    return retorno;
  }
  
  public void updateBeneficioDisponible(Long codeSede, Long codeSubpro) throws SQLException
  {
    String query="";
    if((Object)codeSede != null && (Object)codeSubpro != null)
    {
      query = "select max(codigo) codigo from tcs_ben_subprograma_sede "+
                     "where sbpr_codigo = "+codeSubpro+
                     " and sede_codigo = "+codeSede;
      ResultSet rst = cf.getRecordsRset(query, null,conn);
      if(rst.next())
      {
        query = "update  TCS_BEN_SUBPROGRAMA_SEDE "+
                "set NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE - 1 "+
                "where codigo = "+rst.getString("codigo");
        int iReg = cf.execSql(query,null,conn);
      }
    }            
  }
  
    public void aumentarBeneficioDisponible(String codeSede, Long codeSubpro) throws SQLException
    {
      String query="";
      if((Object)codeSede != null && (Object)codeSubpro != null)
      {
        query = "select max(codigo) codigo from tcs_ben_subprograma_sede "+
                       "where sbpr_codigo = "+codeSubpro+
                       " and sede_codigo = "+codeSede;
        ResultSet rst = cf.getRecordsRset(query, null,conn);
        if(rst.next())
        {
          query = "update  TCS_BEN_SUBPROGRAMA_SEDE "+
                  "set NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + 1 "+
                  "where codigo = "+rst.getString("codigo");
          int iReg = cf.execSql(query,null,conn);
        }
      }            
    }
  
  public boolean updateBeneficioAtributo(Long codeAtributo, Long codeBotNuevo, Long codeBotViejo) throws SQLException
  {
    String query = "update TCS_BEN_BENEFICIO_ATRIBUTO set bot_codigo="+codeBotNuevo+
                   " where BOT_CODIGO = "+codeBotViejo+ " and SAB_CODIGO = "+codeAtributo;
    int iRegUpdate = cf.execSql(query, null, conn);
    if (iRegUpdate>0) return true;
    else return false;
  }
  
  /**
   * @autor Felipe
   * @param Codigobene
   * @return 
   * @throws java.sql.SQLException
   */
  public boolean GetExisteBeneficiario(String Codigobene, String CodSub) throws SQLException 
  {
    int CodigoBeneficiario=Integer.parseInt(Codigobene.trim());
    int CodigoSubprograma =Integer.parseInt(CodSub.trim());
    boolean retorno = false;
    String query = "SELECT CODIGO FROM TCS_BEN_BENEFICIO_OTORGADO "+
                   "WHERE BEN_CODIGO="+CodigoBeneficiario+" "+
                   "AND SBPR_CODIGO="+CodigoSubprograma+" AND campo_a1 IS NULL ";
                          
    
    ResultSet rst = null;
    rst = cf.getRecordsRset(query,null,conn);
		
		if (rst.next()) 
		{
        retorno = true;     
		}
  	rst.close();
    return retorno;
  }
  
   public String getCostBenefit(String strCodeBene) throws SQLException
   {
     String query = "SELECT NVL(TRUNC(VALOR_UNITARIO_BENEFICIO),0) VALOR_UNITARIO_BENEFICIO FROM TCS_BEN_SUBPROGRAMA "+
                    "WHERE CODIGO = "+strCodeBene;
     
     String strCost = null;
     ResultSet rst = null;
     rst = cf.getRecordsRset(query,null,conn);
     if (rst.next())
     {
       strCost = rst.getString("VALOR_UNITARIO_BENEFICIO");
     }else
     {
       strCost = "0";
     }
     
     return strCost;
   }
   
    public String getCostBOT(String strCodeBot) throws SQLException
    {
      String query = "SELECT VALOR FROM VCS_BENEFICIOS_OTORGADOS "+
                     "WHERE CODBOT = "+strCodeBot;
      
      String strCost = null;
      ResultSet rst = null;
      rst = cf.getRecordsRset(query,null,conn);
      if (rst.next())
      {
        strCost = ""+rst.getInt("VALOR");
      }else{
        strCost = "0";
      }
      
      return strCost;
    }
    
    public String getFechaBOT(String strCodeBot) throws SQLException
    {
      String query = "SELECT to_char(to_date(fecha, 'dd/mm/RRRR'), 'rrrr-mm-dd') fechaBOT " +
                     "FROM VCS_BENEFICIOS_OTORGADOS "+
                     "WHERE CODBOT = "+strCodeBot;
      
      String strCost = null;
      ResultSet rst = null;
      rst = cf.getRecordsRset(query,null,conn);
      if (rst.next())
      {
        strCost = rst.getString("fechaBOT");
      }
      
      return strCost;
    }
       
    public String getTercero(String strCodeBot) throws SQLException
    {
      String query = "SELECT trim(TERCERO) tercer" +
                     " FROM TCS_BEN_BENEFICIO_OTORGADO "+
                     " WHERE CODIGO= "+strCodeBot;
      
      String strTercero = null;
      ResultSet rst = null;
      rst = cf.getRecordsRset(query,null,conn);
      if (rst.next())
      {
        strTercero = rst.getString("tercer");
      }
      
      return strTercero;
    }
    
    /**
     * Autor Andres Cespedes, Devuelve el campo tipo beneficio correspondiente a la PK enviada de un BOT.
     * @param strCodeBot
     * @return
     * @throws SQLException
     */
	public String getTipoBeneficio(String strCodeBot) throws SQLException
		{
		  String query = "SELECT trim(TIPO_BENEFICIO) tipo" +
						 " FROM TCS_BEN_BENEFICIO_OTORGADO "+
						 " WHERE CODIGO= "+strCodeBot;
      
		  String strTipo = null;
		  ResultSet rst = null;
		  rst = cf.getRecordsRset(query,null,conn);
		  if (rst.next())
		  {
			strTipo = rst.getString("tipo");
		  }
      
		  return strTipo;
		}
    
   public int GetDisponibilidad(String Codigosede, String CodigoSubpro) throws SQLException 
  {
    int CodSede=Integer.parseInt(Codigosede.trim());
    int CodSubpro=Integer.parseInt(CodigoSubpro.trim());
    int retorno = 0;
    String query = "SELECT NUMERO_BEN_DISPONIBLE "+
                   "FROM TCS_BEN_SUBPROGRAMA_SEDE "+
                   "WHERE SEDE_CODIGO="+CodSede+" "+ 
                   "AND SBPR_CODIGO="+CodSubpro+" ";
                          
    
    ResultSet rst = null;
    rst = cf.getRecordsRset(query,null,conn);
		if (rst.next()) 
		{
        retorno = rst.getInt("NUMERO_BEN_DISPONIBLE");
		}
  	rst.close();
    return retorno;
 }
    public boolean OtorgarBeneficios(Long codeSede, Long codeSubpro, Long codeBeneficiario, 
                                   List lListaInsertar, String Tercero, int i, String strArrIns[], 
                                   String CostBenefit, String DateBenefit) throws SQLException
  {
    boolean retorno = true;
    
    boolean cantidad = checkBeneficio(codeSede,codeSubpro);
    //boolean vigenciaSede = checkVigencia(codeSede, codeSubpro);
    boolean sw = false;
    String strCodeSede = codeSede+"";
    String strCodeSubpro = codeSubpro+"";
    String strCodeBeneficiario = codeBeneficiario+"";
    
    if(cantidad)// && vigenciaSede)
    {
        SubProgramaDAO objSubProgramaDAO;
        int tamanoinsert = lListaInsertar.size();
        
        //proceso para insertar en la tabla beneficio otorgado 
        String strArr[] = {strCodeSubpro,strCodeBeneficiario,strCodeSede,Tercero,CostBenefit,strArrIns[0],strArrIns[1],strArrIns[0],strArrIns[1]};
        
        objSubProgramaDAO = new SubProgramaDAO(cf);
        int insertbienBeneOtorgado = objSubProgramaDAO.InsetBeneficioOtorgado(strArr,i,DateBenefit);
        //fin del proceso 
       
       if(Tercero == null)
       {
        sw = true;
       }else
       {
         if(Tercero.equals(""))
         {
           sw = true;
         }
       }
        
        
       //Proceso para actualizar la cantidad disponible
        if(sw)
        {
          updateBeneficioDisponible(codeSede,codeSubpro);
        }
       //fin del proceso
       
       //proceso para calcular el codigo maximo en la tabla beneficio otorgado
         String CodMaxBenefOtor = objSubProgramaDAO.CodMaxBenOtor();
         cf.closeConnection(objSubProgramaDAO.getConn());
       //fin del proceso
      
      AtributosDAO objAtributoDAO = new AtributosDAO(cf);
      for(int j=0;j<tamanoinsert;j++)
      {
        Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO)lListaInsertar.get(j);
        
        if(objBenAtri.getVariable().trim().equals("") == false){
        	System.err.println("[BeneficioDAO.OtorgarBeneficios]tipo atributo=" + objBenAtri.getTipoatributo());
            if((objBenAtri.getTipoatributo()).equals("R"))
            {
                int insertobeneficiarioatri = objAtributoDAO.InsertBeneficiarioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), objBenAtri.getCodbeneficiario(),i,strArrIns);
              
            }else
            {
               int insertobeneficioatri = objAtributoDAO.InsertBeneficioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), CodMaxBenefOtor,i,strArrIns);
              
            }
        }
      }
      cf.closeConnection(objAtributoDAO.getConn());
    }else
    {
      return retorno = false;
    }
    return retorno;
  }
  
  /**
   * 
   * @param codeSede
   * @param codeSubpro
   * @param codeBeneficiario
   * @param lListaInsertar
   * @param Tercero
   * @param i
   * @param strArrIns
   * @param CostBenefit
   * @param DateBenefit
   * @return
   * @throws SQLException
   */
  public boolean OtorgarBeneficios(Long codeSede, Long codeSubpro, Long codeBeneficiario, 
									 List lListaInsertar, String Tercero, int i, String strArrIns[], 
									 String CostBenefit, String DateBenefit, String TypeBenefit) throws SQLException
	{
	  boolean retorno = true;
    
	  boolean cantidad = checkBeneficio(codeSede,codeSubpro);
	  //boolean vigenciaSede = checkVigencia(codeSede, codeSubpro);
	  boolean sw = false;
	  String strCodeSede = codeSede+"";
	  String strCodeSubpro = codeSubpro+"";
	  String strCodeBeneficiario = codeBeneficiario+"";
    
	  if(cantidad)// && vigenciaSede)
	  {
		  SubProgramaDAO objSubProgramaDAO;
		  int tamanoinsert = lListaInsertar.size();
        
		  //proceso para insertar en la tabla beneficio otorgado 
		  String strArr[] = {strCodeSubpro,strCodeBeneficiario,strCodeSede,Tercero,CostBenefit,TypeBenefit,strArrIns[0],strArrIns[1],strArrIns[0],strArrIns[1]};
        
		  objSubProgramaDAO = new SubProgramaDAO(cf);
		  int insertbienBeneOtorgado = objSubProgramaDAO.InsetBeneficioOtorgado(strArr,i,DateBenefit);
		  //fin del proceso 
       
		 if(Tercero == null)
		 {
		  sw = true;
		 }else
		 {
		   if(Tercero.equals(""))
		   {
			 sw = true;
		   }
		 }
        
        
		 //Proceso para actualizar la cantidad disponible
		  if(sw)
		  {
			updateBeneficioDisponible(codeSede,codeSubpro);
		  }
		 //fin del proceso
       
		 //proceso para calcular el codigo maximo en la tabla beneficio otorgado
		   String CodMaxBenefOtor = objSubProgramaDAO.CodMaxBenOtor();
		   cf.closeConnection(objSubProgramaDAO.getConn());
		 //fin del proceso
      
		AtributosDAO objAtributoDAO = new AtributosDAO(cf);
		for(int j=0;j<tamanoinsert;j++)
		{
		  Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO)lListaInsertar.get(j);
        
		  if(objBenAtri.getVariable().trim().equals("") == false){
			  System.err.println("[BeneficioDAO.OtorgarBeneficios]tipo atributo=" + objBenAtri.getTipoatributo());
			  if((objBenAtri.getTipoatributo()).equals("R"))
			  {
				  int insertobeneficiarioatri = objAtributoDAO.InsertBeneficiarioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), objBenAtri.getCodbeneficiario(),i,strArrIns);
              
			  }else
			  {
				 int insertobeneficioatri = objAtributoDAO.InsertBeneficioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), CodMaxBenefOtor,i,strArrIns);
              
			  }
		  }
		}
		cf.closeConnection(objAtributoDAO.getConn());
	  }else
	  {
		return retorno = false;
	  }
	  return retorno;
	}
	//FIN! OTORGAR BENEFICIO CON ADICION DE TIPO BENEFICIO
    
    public boolean UpdateBOT(String codeSede, Long codeSubpro, Long codeBeneficiario, 
                                   List lListaInsertar, String Tercero, int i, String strArrIns[], 
                                   String CostBenefit, String DateBenefit, String codeBot, String codeSedeOld) throws SQLException
    {
    boolean retorno = true;
    boolean cantidad = false;
    
    if(codeSede.equals(codeSedeOld)){
        cantidad = true;
    } else {
        cantidad = checkBeneficio(new Long(codeSede),codeSubpro);
    }
    
    boolean sw = false;
    
    if(cantidad)
    {
        SubProgramaDAO objSubProgramaDAO;
        int tamanoinsert = lListaInsertar.size();
        
        //proceso para actualizar en la tabla beneficio otorgado 
        String strArr[] = {codeSede,Tercero,CostBenefit,strArrIns[0],strArrIns[1]};
        
        objSubProgramaDAO = new SubProgramaDAO(cf);
        int updated = objSubProgramaDAO.updateBeneficioOtorgado(strArr,i,DateBenefit, codeBot);
        //fin del proceso 
       
       if(updated == 1){
           if(Tercero == null)
           {
            sw = true;
           }else
           {
             if(Tercero.equals(""))
             {
               sw = true;
             }
           }
            
           //Proceso para actualizar la cantidad disponible
            if(sw && !codeSede.equals(codeSedeOld))
            {
            //Para disminuir en uno el n�mero de beneficios disponibles en la nueva sede
              updateBeneficioDisponible(new Long(codeSede),codeSubpro); 
              
            //Para aumentar en uno el n�mero de beneficios disponibles en la nueva sede
              aumentarBeneficioDisponible(codeSedeOld, codeSubpro);
            }
           //fin del proceso
           
           AtributosDAO objAtributoDAO = new AtributosDAO(cf);
           for(int j=0;j<tamanoinsert;j++)
           {
            Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO)lListaInsertar.get(j);
			System.err.println("[BeneficioDAO.UpdateBOT]tipo atributo=" + objBenAtri.getTipoatributo());
            if((objBenAtri.getTipoatributo()).equals("R")){
                int updatedbeneficiarioatri = objAtributoDAO.InsertBeneficiarioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), objBenAtri.getCodbeneficiario(),i,strArrIns);
              
            }else{
               int updatedbeneficioatri = objAtributoDAO.updateBeneficioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), codeBot,i,strArrIns);
              
            }
           }
           cf.closeConnection(objAtributoDAO.getConn());
       } else {
           return retorno = false;
       }
       
    }else
    {
      return retorno = false;
    }
    return retorno;
    }
    
    /**
     * Actualiza el Bot despues de hacer la inclusion del atributo tipo_beneficio para la tabla BOT.
     * @param codeSede
     * @param codeSubpro
     * @param codeBeneficiario
     * @param lListaInsertar
     * @param Tercero
     * @param i
     * @param strArrIns
     * @param CostBenefit
     * @param DateBenefit
     * @param codeBot
     * @param codeSedeOld
     * @param tipoBot
     * @return
     * @throws SQLException
     */
	public boolean UpdateBOT(String codeSede, Long codeSubpro, Long codeBeneficiario, 
									   List lListaInsertar, String Tercero, int i, String strArrIns[], 
									   String CostBenefit, String DateBenefit, String codeBot, String codeSedeOld, String tipoBot) throws SQLException
		{
		boolean retorno = true;
		boolean cantidad = false;
    
		if(codeSede.equals(codeSedeOld)){
			cantidad = true;
		} else {
			cantidad = checkBeneficio(new Long(codeSede),codeSubpro);
		}
    
		boolean sw = false;
    
		if(cantidad)
		{
			SubProgramaDAO objSubProgramaDAO;
			int tamanoinsert = lListaInsertar.size();
        
			//proceso para actualizar en la tabla beneficio otorgado 
			String strArr[] = {codeSede,Tercero,CostBenefit,strArrIns[0],strArrIns[1]};
        
			objSubProgramaDAO = new SubProgramaDAO(cf);
			int updated = objSubProgramaDAO.updateBeneficioOtorgado(strArr,i,DateBenefit, codeBot, tipoBot);
			//fin del proceso 
       
		   if(updated == 1){
			   if(Tercero == null)
			   {
				sw = true;
			   }else
			   {
				 if(Tercero.equals(""))
				 {
				   sw = true;
				 }
			   }
            
			   //Proceso para actualizar la cantidad disponible
				if(sw && !codeSede.equals(codeSedeOld))
				{
				//Para disminuir en uno el n�mero de beneficios disponibles en la nueva sede
				  updateBeneficioDisponible(new Long(codeSede),codeSubpro); 
              
				//Para aumentar en uno el n�mero de beneficios disponibles en la nueva sede
				  aumentarBeneficioDisponible(codeSedeOld, codeSubpro);
				}
			   //fin del proceso
           
			   AtributosDAO objAtributoDAO = new AtributosDAO(cf);
			   for(int j=0;j<tamanoinsert;j++)
			   {
				Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO)lListaInsertar.get(j);
				System.err.println("[BeneficioDAO.UpdateBOT]tipo atributo=" + objBenAtri.getTipoatributo());
				if((objBenAtri.getTipoatributo()).equals("R")){
					int updatedbeneficiarioatri = objAtributoDAO.InsertBeneficiarioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), objBenAtri.getCodbeneficiario(),i,strArrIns);
              
				}else{
				   int updatedbeneficioatri = objAtributoDAO.updateBeneficioAtri(objBenAtri.getVariable().trim(), objBenAtri.getTipodato(), objBenAtri.getCodigoatributo(), codeBot,i,strArrIns);
              
				}
			   }
			   cf.closeConnection(objAtributoDAO.getConn());
		   } else {
			   return retorno = false;
		   }
       
		}else
		{
		  return retorno = false;
		}
		return retorno;
		}
    
    public String getSedeBOT(String codeBot) throws SQLException {
        String query = "SELECT CODSEDE FROM VCS_BENEFICIOS_OTORGADOS "+
                       " WHERE CODBOT ="+codeBot;
                       
        ResultSet rst = null;
        rst = cf.getRecordsRset(query,null,conn);
        rst.next();
        return rst.getString(1);        
    }
  
    public Collection getDetailsBeneficios(String strCodeBen, String strCodeSubpro) throws SQLException
    {
       String query = "SELECT * FROM VCS_BENEFICIOS_OTORGADOS "+
                     "WHERE CODBEN = ? "+
                     "AND CODSUBPROG = ? "+
                     "ORDER BY CODBOT";

      ResultSet rst = null;
      String strArray[] = {strCodeBen,strCodeSubpro};
      rst = cf.getRecordsRset(query,strArray,conn);
      BeneficioVO beneficioVO =  null;
      int Total = 0;
      ArrayList beneficios = new ArrayList();
      while(rst.next()) 
      {
          beneficioVO = new BeneficioVO();
          beneficioVO.setCode(new Long(rst.getLong("CODSUBPROG"))); 
          beneficioVO.setNombre(rst.getString("NOMSUBPROG"));
          beneficioVO.setFecha(rst.getString("FECHA"));
          beneficioVO.setCodSede(new Long(rst.getLong("CODSEDE")));
          beneficioVO.setNomSede(rst.getString("NOMSEDE"));
          beneficioVO.setCodeBot(new Long(rst.getLong("CODBOT")));
          beneficioVO.setValor(rst.getInt("Valor"));
          Total += rst.getDouble("Valor"); 
          beneficios.add(beneficioVO);
          beneficioVO=null;
      }
        if(beneficios != null && beneficios.size() > 0)
        {
            beneficioVO = new BeneficioVO();
            beneficioVO.setCode(new Long("0"));
            beneficioVO.setNombre("TOTAL");
            beneficioVO.setFecha("");
            beneficioVO.setCodSede(new Long("0"));
            beneficioVO.setNomSede("");
            beneficioVO.setCodeBot(new Long("0"));
            beneficioVO.setValor(Total);
            beneficios.add(beneficioVO);
        }
        
      rst.close();
      return beneficios;
    }
  
   public boolean deleteBOT(String codeBOT) throws SQLException {
       String query = " SELECT SBPR_CODIGO, SEDE_CODIGO " +
                      " FROM TCS_BEN_BENEFICIO_OTORGADO WHERE CODIGO ="+codeBOT;      
       
       ResultSet rst = cf.getRecordsRset(query,null,conn);
       
       rst.next();
       
       String codeSede = rst.getString("SEDE_CODIGO"); 
       String codeSub = rst.getString("SBPR_CODIGO");
       
       query = " delete from tcs_ben_beneficio_atributo " +
                      " where BOT_CODIGO ="+codeBOT;

       int delete = cf.execSql(query,null,conn);
       
       query = " delete from tcs_ben_beneficio_otorgado " +
               " where codigo ="+codeBOT;
               
       delete += cf.execSql(query,null,conn);
       
       if(delete > 0){
           rst = null;
           query = "select max(codigo) codigo from tcs_ben_subprograma_sede "+
                          "where sbpr_codigo = "+codeSub+
                          " and sede_codigo = "+codeSede;
                          
           rst = cf.getRecordsRset(query, null,conn);
           if(rst.next())
           {
             query = "update  TCS_BEN_SUBPROGRAMA_SEDE "+
                     "set NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + 1 "+
                     "where codigo = "+rst.getString("codigo");
             int update = cf.execSql(query,null,conn);
             
             if(update > 0){
                 return true;
             }
           }
        }

        return false;            
   }
   
   public boolean ValidateDeleteBOT(String groupUserName, String nameUser, String codeBOT) throws SQLException 
  {
        String query = "select count(1) cantidad " +
                    " FROM VCS_BENEFICIOS_OTORGADOS" +
                    " WHERE ('ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' OR USUARIOCREA = '"+nameUser+"')"+
                    " AND CODBOT = "+codeBOT;
            
        ResultSet rst = null;    
        rst = cf.getRecordsRset(query,null,conn);
        rst.next();
        
        if(rst.getInt("cantidad") > 0){
            rst.close();
            return true;
        } else {
            rst.close();
            return false;
        }
  }
  
    public boolean ValidateEditBOT(String groupUserName, String nameUser, String codeBOT) throws SQLException 
    {
         String query = "select count(1) cantidad " +
                     " FROM VCS_BENEFICIOS_OTORGADOS" +
                     " WHERE ('ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' OR USUARIOCREA = '"+nameUser+"')"+
                     " AND CODBOT = "+codeBOT;
             
         ResultSet rst = null;    
         rst = cf.getRecordsRset(query,null,conn);
         rst.next();
         
         if(rst.getInt("cantidad") > 0){
             rst.close();
             return true;
         } else {
             rst.close();
             return false;
         }
    }
     
   public Connection getConn()
  {
    return conn;
  }
  

}